﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using Newtonsoft.Json;

namespace Anuntiomatic.Server.api
{
    /// <summary>
    /// Summary description for AnuntiomaticServer
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    
    public class AnuntiomaticServer : System.Web.Services.WebService
    {

        private DBDataContext db = new DBDataContext();
        string encryptKey = "Rg2KaU14ddzlRu7VwTXQO30rJnGzAIKMglJKv0XqHAw=";//Key mã hóa
        string iv = "2Giw+DND7CYd6l4qZJHg/A==";//Vector mã hóa

        [WebMethod]
        public string Register(string email, string password, string anuntiomaticAccount)
        {
            try
            {
                if (db.AccountInfos.Any(p => p.Email == email))
                {
                    return "Email đã tồn tại, vui lòng chọn email khác";
                }

                AccountInfo acc = new AccountInfo();
                acc.Email = email;
                acc.Password = password;
                acc.RegisterDate = DateTime.Now;
                acc.LicenseFrom = DateTime.Now;
                acc.LicenseTo = DateTime.Now;
                acc.AnuntiomaticAccount = anuntiomaticAccount;
                db.AccountInfos.InsertOnSubmit(acc);
                db.SubmitChanges();
                return "00";
            }
            catch
            {
                return "Có lỗi khi đăng ký tài khoản. Vui lòng đăng ký lại hoặc liên hệ với tác giả!";
            }

        }
       
        [WebMethod]
        public string Login(string email, string password)
        {
            try
            {
                AccountInfo acc = db.AccountInfos.FirstOrDefault(p => p.Email == email && p.Password == password);
                if (acc != null)
                {
                    return acc.AnuntiomaticAccount;
                }
                return string.Empty;
            }
            catch
            {
                return string.Empty;
            }
        }

        [WebMethod]
        public string ChangePassword(string email, string oldPass, string newPass)
        {
            try
            {
                var acc = db.AccountInfos.FirstOrDefault(p => p.Email == email && p.Password == oldPass);
                if (acc == null)
                    return "Tài khoản hoặc mật khẩu không chính xác";
                acc.Password = newPass;
                db.SubmitChanges();
                return "00";
            }
            catch
            {
                return "Có lỗi xảy ra khi thay đổi mật khẩu";
            }
        }

        [WebMethod]
        public string CheckLicence(string email)
        {
            LicenseInfo retValue = new LicenseInfo();
            try
            {
                var acc = db.AccountInfos.FirstOrDefault(p => p.Email == email);
                if (acc == null)
                {
                    retValue.Email = null;
                    retValue.LicenseTo = acc.LicenseTo;
                    retValue.Expired = true;
                }
                else
                {
                    retValue.Email = acc.Email;
                    retValue.LicenseTo = acc.LicenseTo;
                    retValue.Expired = (acc.LicenseTo >= DateTime.Now ? false : true);
                }

                return JsonConvert.SerializeObject(retValue, Formatting.Indented).ToAESEncryptString(encryptKey, iv);
            }
            catch
            {
                retValue.Email = null;
                retValue.Expired = true;
                return JsonConvert.SerializeObject(retValue, Formatting.Indented).ToAESEncryptString(encryptKey, iv);
            }
        }

        [WebMethod]
        public string Charging(string email, string telco, string pincard, string serialcard)
        {
            try
            {
                RequestInfo info = new RequestInfo();
                //Merchant site id
                info.Merchant_id = "35060";
                //Email tài khoản nhận tiền khi nạp
                info.Merchant_acount = "minhgiangeit@gmail.com";
                //Mật khẩu giao tiếp khi đăng ký merchant site
                info.Merchant_password = "giang123@1207";

                //Nhà mạng
                info.CardType = telco;
                info.Pincard = pincard;

                //Mã đơn hàng
                info.Refcode = (new Random().Next(0, 10000)).ToString();
                info.SerialCard = serialcard;

                ResponseInfo result = NLCardLib.CardChage(info);
                if (result.Errorcode.Equals("00"))
                {
                    decimal amount = decimal.Parse(result.Card_amount);
                    decimal unitPrice = db.Prices.FirstOrDefault(p => p.PriceID == "Anuntiomatic").UnitPrice;
                    decimal add_day = (amount / unitPrice);
                    result.Message = result.Message + " Bạn đã gia hạn thêm " + add_day + " ngày. Cám ơn bạn đã sử dụng phần mềm";
                    
                    //Cập nhật lịch sử nạp tiền
                    AccountChargingHistory acc_history = new AccountChargingHistory();
                    acc_history.Email = email;
                    acc_history.ChargedDate = DateTime.Now;
                    acc_history.Amount = amount;
                    acc_history.TelCo = telco;
                    db.AccountChargingHistories.InsertOnSubmit(acc_history);

                    //Cập nhật thông tin tài khoản
                    AccountInfo acc = db.AccountInfos.FirstOrDefault(p => p.Email == email);
                    if (acc != null)
                    {
                        acc.LicenseFrom = DateTime.Now;
                        acc.LicenseTo = (acc.LicenseTo > acc.LicenseFrom? acc.LicenseTo: acc.LicenseFrom)
                            .AddDays(Convert.ToDouble(add_day));
                    }
                    
                    //Submit
                    db.SubmitChanges();
                }
                return JsonConvert.SerializeObject(result, Formatting.Indented).ToAESEncryptString(encryptKey, iv);
            }
            catch (Exception)
            {
                ResponseInfo result = new ResponseInfo();
                result.Errorcode = "99";
                result.Message = "Lỗi không xác định.";
                return JsonConvert.SerializeObject(result, Formatting.Indented).ToAESEncryptString(encryptKey, iv);
            }
        }
    }
}
